package cn.zhukelili.base;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;

/**
 * @description: 场景类
 * @author: hhbeast
 * @since: 2018/7/28 10:10
 */
public class Client {
    //运行四则运算
    public static void main(String[] args) throws IOException {
        String expStr = getExpStr();
//赋值
        HashMap<String, Integer> var = getValue(expStr);
        Calculator cal = new Calculator(expStr);
        System.out.println("运算结果为：" + expStr + "=" + cal.run(var));
    }

    //获得表达式
    public static String getExpStr() throws IOException {
        System.out.print("请输入表达式：");
        return (new BufferedReader(new InputStreamReader(System.in))).readLine();
    }

    //获得值映射
    public static HashMap<String, Integer> getValue(String exprStr) throws IOException {
        HashMap<String, Integer> map = new HashMap<String, Integer>();
        //解析有几个参数要传递
        for (char ch : exprStr.toCharArray()) {
            if (ch != '+' && ch != '-') {
                //解决重复参数的问题
                if (!map.containsKey(String.valueOf(ch))) {
                    String in = new BufferedReader(new InputStreamReader(System.in)).readLine();
                    map.put(String.valueOf(ch), Integer.valueOf(in));
                }
            }
        }
        return map;
    }
}

/*
其中，getExpStr是从键盘事件中获得的表达式，getValue方法是从键盘事件中获得表达
式中的元素映射值，运行过程如下。
● 首先，要求输入公式。
请输入表达式：a+b-c
● 其次，要求输入公式中的参数。
请输入a的值：100
请输入b的值：20
请输入c的值:40
● 最后，运行出结果。
运算结果为：a+b-c=80
看，要求输入一个公式，然后输入参数，运行结果出来了！那我们是不是可以修改公
式？当然可以，我们只要输入公式，然后输入相应的值就可以了，公式是在运行时定义的，
而不是在运行前就制定好的，是不是类似于初中学过的“代数”这门课？先公式，然后赋值，
运算出结果。
需求已经开发完毕，公式可以自由定义，只要符合规则（有变量有运算符合）就可以运
算出结果；若需要扩展也非常容易，只要增加SymbolExpression的子类就可以了，这就是解
释器模式。
 */